package de.timoh.standardchatplugin;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;


/**
 *
 * Klasse zum Speichern und Laden von Spielerobjekten !<br>
 * Dateiformat: .serializable<br><br>
 *
 * Spieler können in der Textdatei per Hand zu einem Rank hinzugefügt werden:<br>
 * Admin.txt für Admins<br>
 * Mod.txt für Mods<br>
 *
 * Alle anderen werden automatisch generiert!<br><br>
 *
 * Die serialisierte HashMap enthält alle Spielerdaten.
 *
 * @author Timo Hanisch
 * @version 0.1
 * @see PlayerEx
 * 
 **/
public class PlayerHandler{
    private static String pathAdmin = "Admins.txt";
    private static String pathMod = "Mods.txt";
    private static String pathMap = "PlayerMap.serializable";


    /**
     *
     * Die Methode load wird beim Laden des Plugins aufgerufen.
     * @see StandardChatPlugin
     *
     * Es werden alle Spielerdaten aus den Daten (Mods.txt, Admins.txt und PlayerMap.serializable)
     * geladen.
     * @param plugin
     **/

    public static void load (StandardChatPlugin plugin){
        File file = new File(pathAdmin);
        BufferedReader reader;
        //Load PlayerMap
        ObjectInputStream ois;
        try {
            if(new File(pathMap).exists()){
                ois = new ObjectInputStream(new FileInputStream(pathMap));
                PlayerEx.setPlayerMap((HashMap<String, PlayerEx>) ois.readObject());
                ois.close();
                System.out.println("SCP: PlayerMap wurde erfolgreich geladen");
            }
            reader = new BufferedReader(new FileReader(file));
            String line = "";
            String input = "";
            while((line = reader.readLine()) != null){
                input = input + line;
            }
            System.out.println("SCP: Admins auf dem Server ["+input+"]");
            String [] userNames = input.split(";");
            for(int i = 0; i < userNames.length;i++){
                if(!PlayerEx.isPlayerInMap(userNames[i])){
                    PlayerEx pex = new PlayerEx(userNames[i]);
                    pex.setRank(PlayerEx.RANK_ADMIN,false);
                    if(plugin.isPlayerOnline(userNames[i])){
                        pex.setDisplayName(plugin.getServer().getPlayer(userNames[i]));
                    }
                    System.out.println("SCP: "+userNames[i]+" ist nun Admin");
                }else if(PlayerEx.isPlayerInMap(userNames[i]) && PlayerEx.getPlayer(userNames[i]).getRank() != PlayerEx.RANK_ADMIN){
                    PlayerEx pex = PlayerEx.getPlayer(userNames[i]);
                    pex.setRank(PlayerEx.RANK_ADMIN,false);
                    if(plugin.isPlayerOnline(userNames[i])){
                        pex.setDisplayName(plugin.getServer().getPlayer(userNames[i]));
                    }
                    System.out.println("SCP: "+userNames[i]+" ist nun Admin");
                }
            }
            save();
            reader.close();
        } catch (FileNotFoundException ex) {
            System.err.println("Fehler: "+ex);
        } catch (IOException ex) {
            System.err.println("Fehler: "+ex);
        } catch (ClassNotFoundException ex) {
            System.err.println("Fehler: "+ex);
        }
    }


    /**
     * Save wird aufgerufen, sobald ein neuer Spielereintrag erstellt wurde.
     * Zusätzlich wird sie bei Backups aufgerufen.
     **/
    public static void save (){
        ObjectOutputStream oos;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(pathMap));
            oos.writeObject(PlayerEx.getPlayerMap());
            oos.close();
            System.out.println("SCP: PlayerMap wurde erfolgreich gespeichert.");
        } catch (IOException ex) {
            System.err.println("Fehler: "+ex);
        }
    }

    /**
     *
     * Save wird zum speichern von Admin/Mod-Rängen in den dazugehörigen .txt Datein
     * verwendet.
     * @param name
     * @param admin
     */

    public static void save(String name, boolean admin){
        File file = null;
        if (admin) {
            file = new File(pathAdmin);
        } else {
            file = new File(pathMod);
        }
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
            bw.write(name+";");
            bw.close();
        } catch (IOException ex) {
            System.err.println("Fehler: "+ex);
        }
    }

    /**
     *
     * Delete löscht den gegebenen Spielernamen aus der Admins- oder Mods.txt Datei.
     * @param name
     * @param admin
     */

    public static void delete(String name, boolean admin){
        File file = null;
        if (admin) {
            file = new File(pathAdmin);
        } else {
            file = new File(pathMod);
        }
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(file));
            String line = "",input = "";
            while ((line = reader.readLine()) != null) {
                input = input + line;
            }
            System.out.println(input);
            reader.close();
            int start = input.indexOf(name);
            String newS = input.substring(0, start)+input.substring(start+name.length()+1);
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            bw.write(newS);
            bw.close();
        } catch (FileNotFoundException ex) {
            System.err.println("Fehler: "+ex);
        } catch (IOException ex) {
            System.err.println("Fehler: "+ex);
        }
    }
}
